/*================================================================
*   Copyright (C) 2020 belonging to YangZhengQing. All rights reserved.
*   
*   文件名称：fork_pipe.c
*   创 建 者：YangZhengQing
*   创建日期：2020年03月08日
*   描    述：
*
*================================================================*/


//#include "fork_pipe.h"

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>

int main(int argc, char **argv)
{
	int				fd[2];//管道描述符数组
	int				rv = -1;//返回值
	pid_t			pid = -1;//进程id
	char			buff[30];

	memset(buff,0,sizeof(buff)); 

	if(pipe(fd) < 0)//创建管道
	{
		printf("创建管道失败：%s\n",strerror(errno));
	}
	
	pid = fork();//创建进程
	if(pid < 0)
	{
		printf("创建进程失败:%s\n",strerror(errno));
		return 0;
	}
	else if(pid == 0)
	{
		printf("子进程开始运行并开始从管道读数据...\n");
		close(fd[1]);//子进程关闭写端

		rv = read(fd[0],buff,sizeof(buff));//开始读数据
		if(rv < 0)
		{
			printf("子进程读数据失败：%s\n",strerror(errno));
			return -1;
		}
		else
		{
			printf("子进程读到[%d]字节:%s\n",rv,buff);
		}
		close(fd[0]);//子线程关闭读端

		printf("子进程已退出\n");

		return 0;

	}
	
	printf("父进程开始运行并开始向子进程写数据...\n");
	close(fd[0]);//父进程关闭读端

	rv = write(fd[1],"hi,my child,I am your father!",30);//父进程向子进程写数据
	if(rv < 0)
	{
		printf("父进程写数据失败:%s\n",strerror(errno));
	}

	printf("父进程正在等待子进程退出...\n");

	wait(NULL);
	close(fd[1]);//父进程关闭写端
	printf("父进程退出!\n");

	return 0;
}
